package com.xiaojie.progress;

import com.xiaojie.context.DataInfoContext;
import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liaoke
 * @date 2021/11/23
 * 导出阶段
 **/
@Getter
public enum ExportStage {


    /**
     * 加载配置文件
     */
    LOAD_CONFIG(1, "加载导出配置文件"),

    /**
     * 调用导出前扩展点
     */
    EXT_BEFORE_EXPORT(2, "调用导出前扩展点"),

    /**
     * 导出数据库数据
     */
    EXPORT_DATABASE(3, "导出数据库数据"),

    /**
     * 调用导出后扩展点
     */
    EXT_AFTER_EXPORT(4, "调用导出后扩展点"),

    /**
     * 导出数据库数据
     */
    EXPORT_REL_SYSTEM(5, "导出相关系统数据"),

    /**
     * 打包工作目录
     */
    ZIP_DIR(6, "打包工作目录");

    public static Map<Integer, ExportStage> map;

    static {
        map = new HashMap<>();
        for (ExportStage e : ExportStage.values()) {
            map.put(e.getValue(), e);
        }
    }

    /**
     * 获取下一阶段信息
     *
     * @return
     */
    public ExportStage nextStage() {
        if (map.size() == this.value) {
            return null;
        } else {
            return map.get(this.getValue() + 1);
        }
    }

    public void progress(Integer value) {
        progress(value, null);
    }

    public void progress(Integer value, String msg) {
        ExportImportProgress progress = DataInfoContext.get().getProgress();
        if (progress != null) {
            progress.progress(name(), value, msg == null ? desc : desc + ":" + msg);
        }
    }


    public static Map<String, Integer> getStageScaleMap(
            Integer loadConfig,
            Integer extBeforeExport,
            Integer exportDatabase,
            Integer extAfterExport,
            Integer exportRelSystem,
            Integer zipDir
    ) {
        Map<String, Integer> resultMap = new HashMap<>();
        resultMap.put(LOAD_CONFIG.name(), loadConfig == null ? 0 : loadConfig);
        resultMap.put(EXT_BEFORE_EXPORT.name(), extBeforeExport == null ? 0 : extBeforeExport);
        resultMap.put(EXPORT_DATABASE.name(), exportDatabase == null ? 0 : exportDatabase);
        resultMap.put(EXT_AFTER_EXPORT.name(), extAfterExport == null ? 0 : extAfterExport);
        resultMap.put(EXPORT_REL_SYSTEM.name(), exportRelSystem == null ? 0 : exportRelSystem);
        resultMap.put(ZIP_DIR.name(), zipDir == null ? 0 : zipDir);
        return resultMap;
    }


    private Integer value;

    private String desc;

    ExportStage(Integer value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}
